package com.simple.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.simple.common.message.domain.dto.ListAllUserMessageDto;
import com.simple.common.message.domain.dto.ListMessageDto;
import com.simple.common.message.domain.dto.ListMessageTargetsDto;
import com.simple.common.message.domain.entity.Message;
import com.simple.common.message.domain.vo.ListByUserMessageVo;
import com.simple.common.message.domain.vo.ListMessageVo;
import com.simple.common.message.domain.vo.MessageTargetVo;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;


/**
 * @Description 消息表(Message)表数据库访问层
 * @Author xiaoke
 * @Date 2024/8/10 18:00
 * @Version 1.0
 */
public interface MessageMapper extends BaseMapper<Message> {

    /**
     * 分页查询数据
     *
     * @param dto 查询条件
     * @return 对象列表
     */
    List<ListMessageVo> selectPagineList(ListMessageDto dto);

    /**
     * 分页查询数据总数
     *
     * @param dto 查询条件
     * @return 对象列表
     */
    Long selectPagineListCount(ListMessageDto dto);

    /**
     * 批量插入消息目标
     *
     * @param id        消息id
     * @param targetIds 目标用户id
     */
    void insertMessageTargetIds(Long id, Set<Long> targetIds);

    /**
     * 插入消息所有用户
     *
     * @param id 消息id
     */
    void insertMessageAllUser(Long id,Set<Long> excludedIds);

    /**
     * 根据用户id查询消息列表
     *
     * @param userId 用户id
     * @param isRead 是否已读
     * @return 消息列表
     */
    List<ListByUserMessageVo> listByUserMessage(Long userId, Boolean isRead);


    /**
     * 阅读消息
     *
     * @param userId    用户id
     * @param ids       消息id列表
     * @param readTime  阅读时间
     */
    void readMessage(Long userId, Set<Long> ids, LocalDateTime readTime);

    /**
     * 查询当前登录用户消息列表
     *
     * @param dto    查询条件
     * @param userId 用户id
     * @return 消息列表
     */
    List<ListByUserMessageVo> listAllUserMessage(ListAllUserMessageDto dto, Long userId);

    /**
     * 查询当前登录用户消息列表总数
     *
     * @param dto    查询条件
     * @param userId 用户id
     * @return 消息列表总数
     */
    Long listAllUserMessageTotal(ListAllUserMessageDto dto, Long userId);

    /**
     * 分页查询消息目标
     *
     * @param mid       消息id
     * @param dto       查询条件
     * @return 消息目标列表
     */
    List<MessageTargetVo> listMessageTargets(Long mid, ListMessageTargetsDto dto);

    /**
     * 分页查询消息目标总数
     *
     * @param mid       消息id
     * @param dto       查询条件
     * @return 消息目标总数
     */
    Long listMessageTargetsTotal(Long mid, ListMessageTargetsDto dto);

    /**
     * 删除消息目标
     *
     * @param id 消息id
     */
    void deleteMessageTarget(Long id);
    
}

